class Event {
    constructor() {
        this.eventQueue = {}; // 可以认为这是事件中心
    }
    /**
     * 
     * @param {*} eventType 事件类型
     * @param {*} handle    触发事件时，应该执行的函数
     */
    on(eventType, handle) {
        // 相当于监听者，监听事件中心中的某个事件的触发
        if (!this.eventQueue[eventType]) {
            this.eventQueue[eventType] = [];
        }
        if (!this.eventQueue[eventType].includes(handle)) {
            this.eventQueue[eventType].push(handle);
        }
        // {click : [handle1,handle2,...]}
    }
    /**
     * 
     * @param {*} enentType  事件类型
     * @param  {...any} args 参数
     */
    emit(eventType, ...args) {
        // 往事件中心触发某个事件
        if (this.eventQueue[eventType]) {
            this.eventQueue[eventType].forEach((handle, i, _this) => {
                if (handle.once) {
                    // 该事件是通过once绑定的
                    handle.apply(window, args);
                    _this.splice(i, 1);
                } else {
                    handle.apply(window, args);
                }

            })
        }

    }
    off(eventType, handle) {
        if (this.eventQueue[eventType]) {
            this.eventQueue[eventType] = this.eventQueue[eventType].filter(h => h !== handle);
        }
    }
    once(eventType, handle) {
        handle.once = true;
        this.on(eventType, handle);
    }
    remove(eventType) {
        this.eventQueue[eventType] = [];
    }
}
